home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / tools / developer-tools / guis / gadutil / examples / bettertest-c / bettertest.c < prev    next >
C/C++ Source or Header  |  1996-07-16  |  12KB  |  426 lines

  1. /*------------------------------------------------------------------------**
  2. **              My gadutil.library example translated into C              **
  3. **                                          P-O Yliniemi 24-Dec-94        **
  4. ** Compile with SAS/C 6.x:                                                **
  5. **        sc BetterTest.c                                                 **
  6. **        slink lib:c.o BetterTest.o led.o to BetterTest LIB lib:sc.lib   **
  7. **              lib:amiga.lib SMALLDATA SMALLCODE NODEBUG                 **
  8. **------------------------------------------------------------------------*/
  9. #define INTUI_V36_NAMES_ONLY
  10.  
  11. #include <exec/types.h>
  12. #include <exec/execbase.h>
  13. #include <intuition/intuition.h>
  14. #include <intuition/gadgetclass.h>
  15. #include <libraries/gadtools.h>
  16.  
  17. #include <libraries/gadutil.h>
  18. #include <proto/gadutil.h>
  19.  
  20. #include <clib/dos_protos.h>
  21. #include <clib/exec_protos.h>
  22. #include <clib/intuition_protos.h>
  23. #include <clib/gadtools_protos.h>
  24.  
  25. #include <stdio.h>
  26.  
  27. #ifdef LATTICE
  28. int CXBRK(void)     { return(0); }
  29. int chkabort(void)  { return(0); }
  30. #endif
  31.  
  32. extern struct ExecBase *SysBase;
  33.  
  34. #define DRIVE_MX_GAD    11
  35. /*--------------------- Start of localized data --------------------------*/
  36.  
  37. #define MSG_NEXTDRIVE    0
  38. #define MSG_PREVDRIVE    1
  39. #define MSG_DRIVE    2
  40. #define MSG_CHECKME    3
  41. #define MSG_REQUESTER    4
  42. #define MSG_FILENAME    5
  43. #define MSG_INTEGER    6
  44. #define MSG_DRAGME    7
  45. #define MSG_SCROLLME    8
  46. #define MSG_SELECTITEM    9
  47. #define MSG_SELECTCOL    10
  48. #define MNU_1_TITLE    100
  49. #define MNI_1_IT1    101
  50. #define MNI_1_IT2    102
  51. #define MNI_1_IT3    103
  52. #define MNS_1_IT3_1    104
  53. #define MNS_1_IT3_2    105
  54. #define MNI_1_IT4    106
  55.  
  56. static const struct AppString AppStrings[] =
  57. {
  58.     MSG_NEXTDRIVE, (STRPTR)"_Next drive",
  59.     MSG_PREVDRIVE, (STRPTR)"_Prev drive",
  60.     MSG_DRIVE, (STRPTR)"_Drive",
  61.     MSG_CHECKME, (STRPTR)"C_heck me:",
  62.     MSG_REQUESTER, (STRPTR)"_Requester",
  63.     MSG_FILENAME, (STRPTR)"_Filename:",
  64.     MSG_INTEGER, (STRPTR)"_Integer:",
  65.     MSG_DRAGME, (STRPTR)"D_rag me:",
  66.     MSG_SCROLLME, (STRPTR)"Scr_oll me:",
  67.     MSG_SELECTITEM, (STRPTR)"_Select an item:",
  68.     MSG_SELECTCOL, (STRPTR)"Select _Color:",
  69.     MNU_1_TITLE, (STRPTR)" \000Project",
  70.     MNI_1_IT1, (STRPTR)"O\000Open...",
  71.     MNI_1_IT2, (STRPTR)"S\000Save",
  72.     MNI_1_IT3, (STRPTR)" \000Print",
  73.     MNS_1_IT3_1, (STRPTR)" \000Draft",
  74.     MNS_1_IT3_2, (STRPTR)" \000NLQ",
  75.     MNI_1_IT4, (STRPTR)"Q\000Quit",
  76. };
  77.  
  78. #define catalogname "BetterTest.catalog"
  79.  
  80. /*---------------------- End of localized data ---------------------------*/
  81.  
  82. struct TagItem layoutmenutags[] = {
  83.     GTMN_NewLookMenus,    TRUE,
  84.     TAG_DONE
  85. };
  86.  
  87. #define LEFT_OFFSET    6
  88. #define TOP_OFFSET    3
  89.  
  90. struct TagItem StdGTTags[] = {
  91.     GT_Underscore, '_',
  92.     TAG_DONE
  93. };
  94.  
  95. struct TagItem StdButtonTags[] = {
  96.     GU_Flags,    PLACETEXT_IN,    GU_LabelHotkey,    TRUE,    TAG_DONE
  97. };
  98.  
  99. struct TagItem StdGadTags[] = {
  100.     GU_LabelHotkey,    TRUE,    TAG_DONE
  101. };
  102.  
  103. struct TagItem NextDriveGad[] = {
  104.     GU_GadgetKind,    BUTTON_KIND,    GU_LocaleText,    MSG_NEXTDRIVE,
  105.     GU_Left,    LEFT_OFFSET,    GU_Top,        TOP_OFFSET,
  106.     GU_AutoHeight,    4,        GU_AutoWidth,    20,
  107.     TAG_MORE,    (ULONG)StdButtonTags
  108. };
  109.  
  110. struct TagItem PrevDriveGad[] = {
  111.     GU_GadgetKind,    BUTTON_KIND,    GU_LocaleText,    MSG_PREVDRIVE,
  112.     GU_DupeWidth,    MSG_NEXTDRIVE,    GU_LeftRel,    MSG_NEXTDRIVE,
  113.     GU_AddLeft,    INTERWIDTH,    TAG_MORE,    (ULONG)StdButtonTags
  114. };
  115.  
  116. struct TagItem DriveGad[] = {
  117.     GU_GadgetKind,    CYCLE_KIND,    GU_LocaleText,    MSG_DRIVE,
  118.     GU_TopRel,    MSG_PREVDRIVE,    GU_AddTop,        INTERHEIGHT,
  119.     GU_Flags,    PLACETEXT_LEFT,    TAG_MORE,        (ULONG)StdGadTags
  120. };
  121.  
  122. APTR CycleText[] = { "DF0:", "DF1:", "DF2:", "DF3:", NULL };
  123.  
  124. struct TagItem DriveGTTags[] = {
  125.     GTCY_Labels,    (ULONG)CycleText,    TAG_MORE,    (ULONG)StdGTTags
  126. };
  127.  
  128. struct TagItem ReqGad[] = {
  129.     GU_GadgetKind,    BUTTON_KIND,    GU_LocaleText,    MSG_REQUESTER,
  130.     GU_TopRel,    MSG_DRIVE,    GU_AddTop,    INTERHEIGHT,
  131.     TAG_MORE,    (ULONG)StdButtonTags
  132. };
  133.  
  134. struct TagItem CheckBoxGad[] = {
  135.     GU_Width,    CHECKBOX_WIDTH,    GU_Height,    CHECKBOX_HEIGHT,
  136.     GU_GadgetKind,    CHECKBOX_KIND,    GU_LocaleText,    MSG_CHECKME,
  137.     GU_AlignRight,    MSG_NEXTDRIVE,    GU_Flags,    PLACETEXT_LEFT,
  138.     TAG_MORE,    (ULONG)StdGadTags
  139. };
  140.  
  141. struct TagItem FileNameGad[] = {
  142.     GU_GadgetKind,    STRING_KIND,    GU_TopRel,    MSG_REQUESTER,
  143.     GU_LocaleText,    MSG_FILENAME,    GU_AutoHeight,    4,
  144.     GU_AlignLeft,    MSG_CHECKME,    GU_AlignRight,    DRIVE_MX_GAD,
  145.     GU_AddTop,    INTERHEIGHT,    GU_AddWidth,    4,
  146.     TAG_MORE,    (ULONG)StdGadTags
  147. };
  148.  
  149. struct TagItem IntegerGad[] = {
  150.     GU_GadgetKind,    INTEGER_KIND,    GU_TopRel,    MSG_FILENAME,
  151.     GU_LocaleText,    MSG_INTEGER,    GU_AddTop,    INTERHEIGHT,
  152.     TAG_MORE,    (ULONG)StdGadTags
  153. };
  154.  
  155. struct TagItem DriveMxGad[] = {
  156.     GU_GadgetKind,    MX_KIND,    GU_AlignTop,    MSG_NEXTDRIVE,
  157.     GU_Width,    MX_WIDTH,    GU_Height,    MX_HEIGHT,
  158.     GU_AdjustTop,    2,        GU_Flags,    PLACETEXT_LEFT|NG_HIGHLABEL,
  159.     GU_LeftRel,    MSG_PREVDRIVE,    GU_AddLeftChar,    7,
  160.     GU_GadgetText,    (ULONG)"Driv_e",GU_LabelHotkey,    TRUE,
  161.     TAG_DONE
  162. };
  163.  
  164. struct TagItem MXGadGTTags[] = {
  165.     GTMX_Labels,    (ULONG)CycleText,    GTMX_Spacing,    2,
  166.     GTMX_Active,    2,            TAG_DONE
  167. };
  168.  
  169. struct TagItem SliderGad[] = {
  170.     GU_GadgetKind,    SLIDER_KIND,    GU_AlignLeft,    MSG_FILENAME,
  171.     GU_AlignRight,    MSG_FILENAME,    GU_AutoHeight,    4,
  172.     GU_TopRel,    MSG_INTEGER,    GU_AddTop,    INTERHEIGHT,
  173.     GU_AddWidth,    -13,        GU_Flags,    PLACETEXT_LEFT,
  174.     GU_LocaleText,    MSG_DRAGME,    TAG_MORE,    (ULONG)StdGadTags
  175. };
  176.  
  177. struct TagItem SliderGTTags[] = {
  178.     GTSL_Min,        -50,            GTSL_Max,    50,
  179.     GTSL_Level,        10,            GTSL_MaxLevelLen, 3,
  180.     GTSL_LevelFormat,    (ULONG)"%3ld",
  181.     GTSL_LevelPlace,    PLACETEXT_RIGHT,
  182.     TAG_MORE,        (ULONG)StdGTTags
  183. };
  184.  
  185. struct TagItem ListViewGad[] = {
  186.     GU_GadgetKind,    LISTVIEW_KIND,    GU_AlignTop,    MSG_DRIVE,
  187.     GU_AlignBottom,    MSG_INTEGER,    GU_LocaleText,    MSG_SELECTITEM,
  188.     GU_LeftRel,    MSG_INTEGER,    GU_Columns,    26,
  189.     GU_Flags,    PLACETEXT_ABOVE|NG_HIGHLABEL,
  190.     GU_AddLeft,    10,        TAG_MORE,    (ULONG)StdGadTags
  191. };
  192.  
  193. struct TagItem LVGTTags[] = {
  194.     GTLV_Labels,    NULL,        GTLV_ShowSelected,    -1L,
  195.     TAG_MORE,    (ULONG)StdGTTags
  196. };
  197.  
  198. struct TagItem ScrollGad[] = {
  199.     GU_GadgetKind,    SCROLLER_KIND,    GU_LocaleText,    MSG_SCROLLME,
  200.     GU_AlignLeft,    MSG_DRAGME,    GU_AlignRight,    MSG_INTEGER,
  201.     GU_TopRel,    MSG_DRAGME,    GU_AddTop,    INTERHEIGHT,
  202.     GU_Flags,    PLACETEXT_LEFT,    GU_AddWidth,    20,
  203.     GU_DupeHeight,    MSG_DRAGME,    TAG_MORE,    (ULONG)StdGadTags
  204. };
  205.  
  206. struct TagItem ScrollGTTags[] = {
  207.     GTSC_Top,    110,        GTSC_Total,    9,
  208.     GTSC_Visible,    5,        GTSC_Arrows,    16,
  209.     TAG_MORE,    (ULONG)StdGTTags
  210. };
  211.  
  212. struct TagItem PaletteGad[] = {
  213.     GU_GadgetKind,    PALETTE_KIND,    GU_LocaleText,    MSG_SELECTCOL,
  214.     GU_LeftRel,    MSG_SCROLLME,    GU_AddLeft,    INTERWIDTH,
  215.     GU_Flags,    PLACETEXT_ABOVE|NG_HIGHLABEL,
  216.     GU_TopRel,    MSG_SELECTITEM,    GU_AdjustTop,    INTERHEIGHT,
  217.     GU_AlignBottom,    MSG_SCROLLME,    GU_AlignRight,    MSG_SELECTITEM,
  218.     TAG_MORE,    (ULONG)StdGadTags
  219. };
  220.  
  221. struct TagItem PaletteGTTags[] = {
  222.     GTPA_Depth,    2,        GTPA_IndicatorWidth,    36,
  223.     TAG_MORE,    (ULONG)StdGTTags
  224. };
  225.  
  226. struct LayoutGadget gadgets[] = {
  227.     MSG_NEXTDRIVE,    NextDriveGad,    StdGTTags,    NULL,
  228.     MSG_PREVDRIVE,    PrevDriveGad,    StdGTTags,    NULL,
  229.     MSG_DRIVE,    DriveGad,    DriveGTTags,    NULL,
  230.     MSG_REQUESTER,    ReqGad,        StdGTTags,    NULL,
  231.     MSG_CHECKME,    CheckBoxGad,    StdGTTags,    NULL,
  232.     MSG_FILENAME,    FileNameGad,    StdGTTags,    NULL,
  233.     MSG_INTEGER,    IntegerGad,    StdGTTags,    NULL,
  234.     DRIVE_MX_GAD,    DriveMxGad,    MXGadGTTags,    NULL,
  235.     MSG_DRAGME,    SliderGad,    SliderGTTags,    NULL,
  236.     MSG_SELECTITEM,    ListViewGad,    LVGTTags,    NULL,
  237.     MSG_SCROLLME,    ScrollGad,    ScrollGTTags,    NULL,
  238.     MSG_SELECTCOL,    PaletteGad,    PaletteGTTags,    NULL,
  239.     -1,        NULL,        NULL,        NULL
  240. };
  241.  
  242. struct NewMenu MyNewMenu[] = {
  243.      NM_TITLE,    (STRPTR)MNU_1_TITLE,    0,    0,    0,    0,            /* | Project |    */
  244.       NM_ITEM,    (STRPTR)MNI_1_IT1,        0,    0,    0,    (APTR)1,    /* Open [O]        */
  245.       NM_ITEM,    (STRPTR)MNI_1_IT2,        0,    0,    0,    (APTR)2,    /* Save [S]        */
  246.       NM_ITEM,    NM_BARLABEL,            0,    0,    0,    0,            /* -----------    */
  247.       NM_ITEM,    (STRPTR)MNI_1_IT3,        0,    0,    0,    0,            /* Print...        */
  248.        NM_SUB,    (STRPTR)MNS_1_IT3_1,    0,    0,    0,    (APTR)3,    /*      Draft    */
  249.        NM_SUB,    (STRPTR)MNS_1_IT3_2,    0,    0,    0,    (APTR)4,    /*      NLQ        */
  250.       NM_ITEM,    NM_BARLABEL,            0,    0,    0,    0,            /* -----------    */
  251.       NM_ITEM,    (STRPTR)MNI_1_IT4,        0,    0,    0,    (APTR)5,    /* Quit [Q]        */
  252.      NM_END,    NULL,                    0,    0,    0,    0
  253. };
  254.  
  255. LONG farright, farbottom;
  256.  
  257. struct TagItem LayoutTags[] = {
  258.     GU_RightExtreme,    (ULONG)&farright,
  259.     GU_LowerExtreme,    (ULONG)&farbottom,
  260.     GU_DefTextAttr,        0,
  261.     GU_Catalog,        0,
  262.     GU_AppStrings,        (ULONG)&AppStrings,
  263.     TAG_DONE
  264. };
  265.  
  266. /*-----------------------------------------------------------------*/
  267. struct Library *GadUtilBase;
  268.  
  269. struct List      LibraryList;
  270. struct Screen *screen = NULL;
  271. struct Window *main_win = NULL;
  272. APTR priv_info = NULL;
  273.  
  274. void process_window_events(struct Window *, struct Menu *);
  275. void ToggleLED(void);
  276.  
  277. main()
  278. {
  279.     struct Gadget *glist;
  280.     struct Menu *menustrip;
  281.     LibraryList = SysBase->LibList;
  282.  
  283.     LVGTTags[0].ti_Data = (ULONG)&LibraryList;
  284.  
  285.     if (GadUtilBase = OpenLibrary("gadutil.library",0))
  286.     {
  287.         LayoutTags[3].ti_Data = (ULONG)GU_OpenCatalog(catalogname,0);
  288.  
  289.         if (screen = LockPubScreen(NULL))
  290.         {
  291.             LayoutTags[2].ti_Data = (ULONG)screen->Font;
  292.  
  293.             if (priv_info = GU_LayoutGadgetsA(&glist, gadgets, screen, LayoutTags))
  294.             {
  295.                 if (main_win = OpenWindowTags(NULL,
  296.                             WA_Left,    0,
  297.                             WA_Top,        screen->Font->ta_YSize + 3,
  298.                             WA_InnerWidth, farright + LEFT_OFFSET,
  299.                             WA_InnerHeight, farbottom + TOP_OFFSET,
  300.                             WA_IDCMP,    LISTVIEWIDCMP | IDCMP_MENUPICK | CYCLEIDCMP |
  301.                                     IDCMP_REFRESHWINDOW | IDCMP_CLOSEWINDOW |
  302.                                     IDCMP_VANILLAKEY | IDCMP_RAWKEY,
  303.                             WA_Flags,    WFLG_DRAGBAR | WFLG_DEPTHGADGET |
  304.                                     WFLG_CLOSEGADGET | WFLG_ACTIVATE |
  305.                                     WFLG_SMART_REFRESH | WFLG_REPORTMOUSE,
  306.                             WA_Gadgets, glist,    WA_NewLookMenus,    TRUE,
  307.                             WA_Title,    "GadUtil library test",
  308.                             TAG_DONE))
  309.                 {
  310.                     GU_RefreshWindow(main_win, NULL);
  311.                     if (menustrip = GU_CreateLocMenuA(MyNewMenu, priv_info,
  312.                             NULL, layoutmenutags))
  313.                     {
  314.                         if (SetMenuStrip(main_win, menustrip))
  315.                         {
  316.                             process_window_events(main_win, menustrip);
  317.                             ClearMenuStrip(main_win);
  318.                         }
  319.                         GU_FreeMenus(menustrip);
  320.                     }
  321.                     CloseWindow(main_win);
  322.                 }
  323.                 GU_FreeLayoutGadgets(priv_info);
  324.             }
  325.             UnlockPubScreen(NULL, screen);
  326.         }
  327.         GU_CloseCatalog((struct Catalog *)LayoutTags[3].ti_Data);
  328.         CloseLibrary((struct Library *)GadUtilBase);
  329.     }
  330. }
  331.  
  332. void process_window_events(struct Window *win, struct Menu *menuStrip)
  333. {
  334.     struct IntuiMessage *imsg;
  335.     struct Gadget *gad, *tempgad;
  336.     struct MenuItem *item;
  337.     BOOL done = FALSE;
  338.     UWORD menunumber;
  339.     ULONG coords;
  340.  
  341.     while (!done)
  342.     {
  343.         Wait(1 << win->UserPort->mp_SigBit);
  344.  
  345.         while ((!done) && (imsg = GU_GetIMsg(win->UserPort)))
  346.         {
  347.             switch (imsg->Class)
  348.             {
  349.                 case IDCMP_GADGETUP:
  350.                     ToggleLED();
  351.                     gad = (struct Gadget *)imsg->IAddress;
  352.                     switch (gad->GadgetID)
  353.                     {
  354.                         case MSG_NEXTDRIVE:
  355.                             if (tempgad = GU_GetGadgetPtr(DRIVE_MX_GAD, gadgets) )
  356.                             {
  357.                                 if ((LONG)MXGadGTTags[2].ti_Data++ >= 3) MXGadGTTags[2].ti_Data = 0;
  358.                                 GU_SetGadgetAttrsA(tempgad, win, NULL, &MXGadGTTags[2]);
  359.                             }
  360.                             break;
  361.  
  362.                         case MSG_PREVDRIVE:
  363.                             if (tempgad = GU_GetGadgetPtr(DRIVE_MX_GAD, gadgets) )
  364.                             {
  365.                                 if ((LONG)MXGadGTTags[2].ti_Data-- <= 0) MXGadGTTags[2].ti_Data = 3;
  366.                                 GU_SetGadgetAttrsA(tempgad, win, NULL, &MXGadGTTags[2]);
  367.                             }
  368.                             break;
  369.  
  370.                         case MSG_REQUESTER:
  371.                             GU_BlockInput(win);
  372.                             Delay(50);
  373.                             GU_FreeInput(win);
  374.                             break;
  375.  
  376.                         case MSG_DRIVE:
  377.                             ToggleLED();
  378.                             break;
  379.                     }
  380.  
  381.                 case IDCMP_GADGETDOWN:
  382.                     gad = (struct Gadget *)imsg->IAddress;
  383.                     if (gad->GadgetID == DRIVE_MX_GAD)
  384.                         MXGadGTTags[2].ti_Data = imsg->Code;
  385.                     break;
  386.  
  387.                 case IDCMP_MOUSEMOVE:
  388.                     if (tempgad = GU_GetGadgetPtr(MSG_SELECTITEM, gadgets))
  389.                     {
  390.                         coords = (LONG)imsg->MouseX<<16|imsg->MouseY;
  391.  
  392.                         if (GU_CoordsInGadBox(coords,tempgad))
  393.                         {
  394.                             ToggleLED();
  395.                         }
  396.                     }
  397.                     break;
  398.  
  399.                 case IDCMP_MENUPICK:
  400.                     menunumber = imsg->Code;
  401.  
  402.                     while ((menunumber != MENUNULL) && (!done))
  403.                     {
  404.                         item = ItemAddress(menuStrip, menunumber);
  405.  
  406.                         if ( (LONG)GTMENUITEM_USERDATA(item) == 5)
  407.                             done = TRUE;
  408.  
  409.                         menunumber = item->NextSelect;
  410.                     }
  411.                     break;
  412.  
  413.                 case IDCMP_CLOSEWINDOW:
  414.                     done = TRUE;
  415.                     break;
  416.  
  417.                 case IDCMP_REFRESHWINDOW:
  418.                     GU_BeginRefresh(win);
  419.                     GU_EndRefresh(win, TRUE);
  420.                     break;
  421.             }
  422.             GU_ReplyIMsg(imsg);
  423.         }
  424.     }
  425. }
  426.